From 0e60d00e1986c0d6db070168e7576b64d5582ebf Mon Sep 17 00:00:00 2001 From: "awilliam@xenbuild2.aw" Date: Thu, 25 Jan 2007 14:58:41 -0700 Subject: [PATCH] [IA64] Optimize vmx_vcpu_thash() Implement in assembly Signed-off-by: Zhang Xin --- xen/arch/ia64/asm-offsets.c | 1 + xen/arch/ia64/vmx/optvfault.S | 60 +++++++++++++++++++++++++++++++ xen/arch/ia64/vmx/vmx_ivt.S | 2 ++ xen/include/asm-ia64/vmx_mm_def.h | 4 ++- 4 files changed, 66 insertions(+), 1 deletion(-) diff --git a/xen/arch/ia64/asm-offsets.c b/xen/arch/ia64/asm-offsets.c index c10cac45c7..6105406441 100644 --- a/xen/arch/ia64/asm-offsets.c +++ b/xen/arch/ia64/asm-offsets.c @@ -200,6 +200,7 @@ void foo(void) DEFINE(IA64_VPD_BASE_OFFSET, offsetof (struct vcpu, arch.privregs)); DEFINE(IA64_VPD_VIFS_OFFSET, offsetof (mapped_regs_t, ifs)); DEFINE(IA64_VLSAPIC_INSVC_BASE_OFFSET, offsetof (struct vcpu, arch.insvc[0])); + DEFINE(IA64_VPD_VPTA_OFFSET, offsetof (struct mapped_regs, pta)); DEFINE(IA64_VPD_CR_VPTA_OFFSET, offsetof (cr_t, pta)); DEFINE(XXX_THASH_SIZE, sizeof (thash_data_t)); diff --git a/xen/arch/ia64/vmx/optvfault.S b/xen/arch/ia64/vmx/optvfault.S index 6163437e5b..cf827ed98b 100644 --- a/xen/arch/ia64/vmx/optvfault.S +++ b/xen/arch/ia64/vmx/optvfault.S @@ -15,6 +15,7 @@ #include #include #include +#include #define ACCE_MOV_FROM_AR #define ACCE_MOV_FROM_RR @@ -22,6 +23,7 @@ #define ACCE_RSM #define ACCE_SSM #define ACCE_MOV_TO_PSR +#define ACCE_THASH //mov r1=ar3 GLOBAL_ENTRY(vmx_asm_mov_from_ar) @@ -418,6 +420,64 @@ ENTRY(vmx_asm_dispatch_vexirq) br.many vmx_dispatch_vexirq END(vmx_asm_dispatch_vexirq) +// thash +// TODO: add support when pta.vf = 1 +GLOBAL_ENTRY(vmx_asm_thash) +#ifndef ACCE_THASH + br.many vmx_virtualization_fault_back +#endif + extr.u r17=r25,20,7 // get r3 from opcode in r25 + extr.u r18=r25,6,7 // get r1 from opcode in r25 + movl r20=asm_mov_from_reg + ;; + adds r30=vmx_asm_thash_back1-asm_mov_from_reg,r20 + shladd r17=r17,4,r20 // get addr of MOVE_FROM_REG(r17) + adds r16=IA64_VPD_BASE_OFFSET,r21 // get vcpu.arch.priveregs + ;; + mov r24=b0 + ;; + ld8 r16=[r16] // get VPD addr + mov b0=r17 + br.many b0 // r19 return value + ;; +vmx_asm_thash_back1: + shr.u r23=r19,61 // get RR number + adds r25=VCPU_VRR0_OFS,r21 // get vcpu->arch.arch_vmx.vrr[0]'s addr + adds r16=IA64_VPD_VPTA_OFFSET,r16 // get vpta + ;; + shladd r27=r23,3,r25 // get vcpu->arch.arch_vmx.vrr[r23]'s addr + ld8 r17=[r16] // get PTA + mov r26=1 + ;; + extr.u r29=r17,2,6 // get pta.size + ld8 r25=[r27] // get vcpu->arch.arch_vmx.vrr[r23]'s value + ;; + extr.u r25=r25,2,6 // get rr.ps + shl r22=r26,r29 // 1UL << pta.size + ;; + shr.u r23=r19,r25 // vaddr >> rr.ps + adds r26=3,r29 // pta.size + 3 + shl r27=r17,3 // pta << 3 + ;; + shl r23=r23,3 // (vaddr >> rr.ps) << 3 + shr.u r27=r27,r26 // (pta << 3) >> (pta.size+3) + movl r16=VRN_MASK + ;; + adds r22=-1,r22 // (1UL << pta.size) - 1 + shl r27=r27,r29 // ((pta<<3)>>(pta.size+3))<>(pta.size + 3))<> IA64_VRN_SHIFT) +#ifndef __ASSEMBLY__ typedef enum { INSTRUCTION, DATA, REGISTER } miss_type; //typedef enum { MVHPT, STLB } vtlb_loc_type_t; @@ -169,5 +170,6 @@ bits_v(uint64_t v, uint32_t bs, uint32_t be) "M" ((len))); \ ret; \ }) +#endif #endif -- 2.30.2